import java.util.Random;

/**
 * 加减法口算练习系统-v0.2
 * 功能升级：
 * 1. 支持100以上数参与运算（1~199）
 * 2. 每个算式附带答案
 * 3. 加法和≤100，减法差≥0
 * 4. 每行显示3道题，排版整齐
 */
public class CalculationSystemV02 {
    // 配置：每行显示的算式数量
    private static final int EXERCISES_PER_LINE = 3;

    public static void main(String[] args) {
        // 打印系统标题
        System.out.println("==================== 加减法口算练习系统-v0.2 ====================");
        System.out.println("温馨提示：以下为50道口算题（加法和≤100，减法差≥0，含答案）\n");

        // 生成50道习题（返回包含算式和答案的数组）
        Exercise[] exercises = generateExercises(50);

        // 按“每行3道”格式输出
        printExercisesInLines(exercises);

        System.out.println("\n================================================================");
    }

    /**
     * 自定义Exercise类：封装算式字符串和对应答案（数据结构优化）
     */
    static class Exercise {
        String formula; // 算式（如 "123 - 56 = ?"）
        int answer;     // 答案（如 67）

        public Exercise(String formula, int answer) {
            this.formula = formula;
            this.answer = answer;
        }
    }

    /**
     * 生成指定数量的习题（含答案）
     * @param count 习题数量
     * @return 包含算式和答案的Exercise数组
     */
    public static Exercise[] generateExercises(int count) {
        Random random = new Random();
        Exercise[] exercises = new Exercise[count];

        for (int i = 0; i < count; i++) {
            // 1. 随机决定运算类型（50%加法，50%减法）
            boolean isAddition = random.nextBoolean();
            int num1, num2, answer;
            String formula;

            if (isAddition) {
                // 加法逻辑：和 ≤ 100，允许num1/num2为100以上（但和不超100）
                // 例如：num1=120 → num2最大只能是 100 - num1（但num2≥1，所以num1≤99时才有效）
                // 优化：确保num1和num2的和≤100，同时num1/num2≥1（避免0参与，可选）
                num1 = random.nextInt(99) + 1; // num1：1~99（保证num2至少为1）
                num2 = random.nextInt(100 - num1) + 1; // num2：1~(100-num1)，和=num1+num2≤100
                answer = num1 + num2;
                formula = String.format("%3d + %3d = ?", num1, num2); // 格式化对齐
            } else {
                // 减法逻辑：差 ≥0，允许被减数>100，减数可≤被减数
                num1 = random.nextInt(199) + 1; // 被减数：1~199（100以上可选）
                num2 = random.nextInt(num1) + 1; // 减数：1~num1（保证差≥1，避免0差，可选）
                answer = num1 - num2;
                formula = String.format("%3d - %3d = ?", num1, num2); // 格式化对齐
            }

            // 封装算式和答案到Exercise对象
            exercises[i] = new Exercise(formula, answer);
        }
        return exercises;
    }

    /**
     * 按每行指定数量打印习题（含答案），排版整齐
     * @param exercises 习题数组
     */
    public static void printExercisesInLines(Exercise[] exercises) {
        for (int i = 0; i < exercises.length; i++) {
            Exercise ex = exercises[i];
            // 格式化：序号（2位）+ 算式（固定长度）+ 答案（标注）
            String lineItem = String.format("%2d. %-20s （答案：%3d）  ",
                    i + 1, ex.formula, ex.answer);

            System.out.print(lineItem);

            // 每EXERCISES_PER_LINE道题换行，最后一道题无需额外换行
            if ((i + 1) % EXERCISES_PER_LINE == 0) {
                System.out.println();
            }
        }
        // 若总题数不是每行数量的整数倍，补一行换行
        if (exercises.length % EXERCISES_PER_LINE != 0) {
            System.out.println();
        }
    }
}
